package com.example.circuit;

import com.example.exception.CircuitConflictException;
import com.example.exception.SignalSynchronizedException;

import java.util.Queue;

/**
 * 对物理层电信号code和decode方法的枚举
 * 由同一根双绞线链接的device需要使用相同的协议
 */
public enum CircuitSignalParsingEnum implements CircuitSignalParsing{

    NoCode{
        @Override
        public void decode(Queue<Byte> queue, Byte b) {
            if (b!=null) {
                queue.offer(b);
            }
        }
        @Override
        public Byte decode(Queue<Byte> queue, Byte b,Byte synchronous) {
            if (b!=null) {
                queue.offer(b);
            }
            return synchronous;
        }

        @Override
        public void code(Queue<Byte> queue, Byte b) {
            if(b!=null) {
                queue.offer(b);
            }
        }
    },

    ZeroCode{
        @Override
        public void code(Queue<Byte> queue, Byte b) {
            if (b!=null){
                if (b==0){
                    queue.offer((byte) 0);
                    queue.offer((byte) -1);
                }else{
                    queue.offer((byte) 0);
                    queue.offer((byte) 1);
                }
            }
        }

        @Override
        public Byte decode(Queue<Byte> queue, Byte b,Byte synchronous) {
            if (b==null||b==0){
                return 0;
            }else if(synchronous==0){
                if (b==1){queue.offer((byte) 1);}
                else if (b==-1){queue.offer((byte) 0);}
                else {throw new CircuitConflictException("Conflict!");}
                return b;
            }
            return synchronous;
        }

        @Override
        public void decode(Queue<Byte> queue, Byte b) {
            throw new SignalSynchronizedException("Need Synchronous!");
        }
    }


    }
